// 引入Node.js的events模块原型（虽然在此代码中未直接使用）
const { prototype } = require('events');
// 引入Sequelize ORM库
const Sequelize = require('sequelize');

// 创建Sequelize实例，连接到PostgreSQL数据库
const sequelize = new Sequelize('road', 'postgres', '123321', {
    host: 'localhost',
    dialect: 'postgres', // 指定数据库方言为PostgreSQL
    port: 5432 // 数据库端口
});

// 在数据库中开启PostGIS扩展，用于支持地理空间数据类型
sequelize.query('CREATE EXTENSION IF NOT EXISTS postgis;');

// 定义用户模型（表）
const User = sequelize.define('user', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true, // 自增主键
    },
    name: Sequelize.STRING, // 用户名称
    role: Sequelize.INTEGER, // 用户角色（0为管理员，1为普通用户）
    username: Sequelize.STRING, // 用户名
    password: Sequelize.STRING, // 密码
});

// 定义项目（养护记录）模型（表）
const Project = sequelize.define('project', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
    },
    unit: Sequelize.STRING, // 管养单位
    route: Sequelize.STRING, // 路线编号
    imgname: Sequelize.STRING, // 图像名称
    longitude: Sequelize.DOUBLE, // 经度
    latitude: Sequelize.DOUBLE, // 纬度
    time: Sequelize.DATE, // 拍摄时间
    damage: Sequelize.STRING, // 损坏类型
    imgpath: Sequelize.STRING, // 图片路径
    isdispose: {
        type: Sequelize.BOOLEAN,
        defaultValue: false, // 是否已处置，默认值为false
    },
    gemo: Sequelize.GEOMETRY('POINT'), // 点经纬度（地理空间数据）
    userId: Sequelize.INTEGER, // 关联用户ID
    disposeNote: {
        type: Sequelize.STRING,
        defaultValue: '',
        allowNull: true // 处置备注，允许为空
    }
});

// 定义路线模型（表）
const Road = sequelize.define('road', {
    osm_id: {
        type: Sequelize.STRING,
        primaryKey: true, // OSM唯一标识符，作为主键
    },
    highway: Sequelize.STRING, // 路线类型
    name: Sequelize.STRING, // 路线名称
    geom: Sequelize.GEOMETRY('LineString'), // 路线几何形状（线串）
}, {
    timestamps: false, // 不自动添加时间戳字段
});

// 建立模型关联关系
User.hasMany(Project); // 一个用户可以有多个项目
Project.belongsTo(User); // 一个项目属于一个用户

// 同步数据库模型到数据库，如果表不存在则创建
sequelize.sync({
    force: false // 如果为true，则会先删除表再重新创建，这里设置为false以保留现有数据
}).then(async () => {
    console.log('数据库同步成功');
    
    // 查询所有用户，如果数据库为空则创建一个管理员用户
    let users = await User.findAll();
    if (users.length === 0) {
        await User.create({
            name: 'admin',
            role: 0,
            username: 'admin',
            password: 'admin', // 注意：在生产环境中，密码应该加密存储！
        });
        
        // 从本地GeoJSON文件导入路线数据
        const fs = require('fs');
        const path = require('path');
        const geojson = JSON.parse(fs.readFileSync(path.join(__dirname, 'road.geojson'), 'utf8'));
        const roads = geojson.features;
        
        // 遍历GeoJSON中的每个路线特征，并创建对应的数据库记录
        roads.forEach(async (road) => {
            await Road.create({
                osm_id: road.properties.osm_id,
                highway: road.properties.highway,
                name: road.properties.name,
                geom: {
                    type: 'LineString', // GeoJSON中的线串类型
                    coordinates: road.geometry.coordinates // 路线坐标点数组
                }
            });
        });
    }
});

// 导出模型实例和sequelize实例，供其他文件使用
module.exports = {
    User,
    Project,
    sequelize
};